/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "照壁文件页面.h"
#include "编译信息.h"
#include "随机数.h"
#include "A_引擎/文件工程/工程文件.h"


static const S_RGBA8UI g文件名称文字颜色 = { 60, 50, 20, 255 };
static const S_RGBA8UI g暗印章颜色 = { 100, 10, 1, 255 };
static const S_RGBA8UI g明印章颜色  = { 150, 10, 5, 255 };

static uint32 g画心ID = 0;

static void on_照壁文件页面绘制(C_Widget* self, S_2D画布* 画布) {
	C_照壁文件页面* box = static_cast<C_照壁文件页面*>(self);

	box->m_背景绘制.m_属性 = f_vg_gen属性(画布);
	S_凸边图元 图元 = {};
	图元.属性 = f_vg_get属性指针(画布, box->m_背景绘制.m_属性);
	box->m_背景绘制.f_Draw(画布, 图元, E_笔刷类型::e_单色填充);

	box->m_画心绘制.f_Draw(画布, box->m_背景绘制.m_属性, box->m_画心纹理);


	图元 = {};
	图元.属性 = f_vg_get属性指针(画布, box->m_背景绘制.m_属性);
	box->m_印章绘制.f_Draw(画布, 图元, E_笔刷类型::e_单色描边);

	auto& 字体 = f_surface_get字体(*self->m_UIctx, "鸿雷板书简体");
	box->m_文本绘制.f_Draw(画布, &字体, box->m_背景绘制.m_属性);

	//f_随机切换画心纹理();
	
}

static void on_照壁文件页面布局(C_Widget* self, C_Widget** w, uint32 num) {
	if (!num) return;

	C_照壁文件页面* box = dynamic_cast<C_照壁文件页面*>(self);

	w[0]->f_setPos({10, self->m_Size.y - 100 });
	w[0]->f_setSize({20, 100});

	w[1]->f_setPos({ 30, self->m_Size.y - 100 });
	w[1]->f_setSize({ 20, 100 });

	w[2]->f_setPos({ 80, self->m_Size.y - 100 });
	w[2]->f_setSize({ 20, 100 });

	w[3]->f_setPos({ 100, self->m_Size.y - 100 });
	w[3]->f_setSize({ 20, 100 });

	vec2 位置 = { 20, self->m_Size.y * 0.5f };
	box->m_捐款按钮_B站->f_setPos(位置);
	box->m_捐款按钮_B站->f_setSize({ 20, 60 });

	位置.y += 70;
	box->m_捐款按钮_爱发电->f_setPos(位置);
	box->m_捐款按钮_爱发电->f_setSize({ 20, 50 });

	//位置.x += 80;
	uint32 最近文件数量 = num - 4;
	位置.x = self->m_Size.x - 40 - 最近文件数量 * 25;
	位置.y = self->m_Size.y * 0.4;
	box->m_教程视频_B站->f_setPos(位置);
	box->m_教程视频_B站->f_setSize({ 20, 100 });

	位置.x -= 25;
	box->m_教程视频_Youtube->f_setPos(位置);
	box->m_教程视频_Youtube->f_setSize({ 20, 100 });


	位置.x = self->m_Size.x - 40;
	位置.y = 30;
	for (uint32 i = 4; i < num; ++i) {
		w[i]->f_setPos(位置);
		w[i]->f_setSize({20, 300});

		位置.x -= 25;
	}
}

static void on_照壁文件页面变换(C_Widget* self) {
	C_照壁文件页面* box = static_cast<C_照壁文件页面*>(self);

	auto e = self->f_get更新组件();
	uint32 最近文件数量 = e.m_Num - 4;

	box->m_背景绘制.f_alloc(1);
	box->m_画心绘制.f_alloc(1);


	mat3X2 mat;
	mat.row0 = {};
	mat.row1 = self->m_Size;
	mat.row2 = { 6, 0 };
	



	auto time = f_StringToWString(DEF_编译时间);
	uint32 总块数量 = 5 + 最近文件数量;
	box->m_文本绘制.f_alloc(总块数量 + 2, 128);

	box->m_文本绘制.f_绘制文本({ {60, 40}, {20, 250} }, { 10,10,10,255 }, 0, time, E_对齐方式::e_纵向齐);
	//for (uint32 i = 0; i < 4; ++i) {
	//	box->m_文本绘制.f_绘制文本({ e.m_W[i]->m_Pos, e.m_W[i]->m_Size }, { 10,10,10,255 }, i, time, E_对齐方式::e_纵向齐);
	//}
	vec2 接口入口坐标 = box->m_捐款按钮_B站->m_Pos;
	接口入口坐标.x += 2;
	接口入口坐标.y -= 60;
	//box->m_文本绘制.f_绘制文本({ 接口入口坐标, {20, 100} }, { 10,10,10,255 }, 1, L"资助入口", E_对齐方式::e_纵向齐);
	


	接口入口坐标 = box->m_教程视频_B站->m_Pos;
	//box->m_文本绘制.f_绘制文本({ 接口入口坐标, {20, 100} }, box->m_教程视频_B站->m_颜色A, 2, L"B站教程视频", E_对齐方式::e_纵向齐);

	接口入口坐标 = box->m_教程视频_Youtube->m_Pos;
	//box->m_文本绘制.f_绘制文本({ 接口入口坐标, {20, 100} }, box->m_教程视频_Youtube->m_颜色A, 3, L"油管教程视频", E_对齐方式::e_纵向齐);


	time = L"最近文件";
	box->m_文本绘制.f_绘制文本({ {self->m_Size.x - 40, 80}, {20, 250} }, { 10,10,10,255 }, 4, time, E_对齐方式::e_纵向齐);


	for (uint32 i = 5; i < e.m_Num; ++i) {
		//box->m_文本绘制.f_绘制文本({ e.m_W[i]->m_Pos, {20, 150} }, e.m_W[i]->m_颜色A, i, e.m_W[i]->m_WName, E_对齐方式::e_纵向齐);
	}




	mat.row1.y -= 25;
	box->m_背景绘制.f_set单色填充(0, mat, S_RGBA8UI{130, 130, 120, 255}, S_Widget预设凸包图元::m_矩形);
	mat.row2 = { 10, 0 };
	box->m_画心绘制.f_set(0, mat, S_Widget预设凸包图元::m_矩形, g画心ID);


	mat.row0 = box->m_捐款按钮_B站->m_Pos;
	mat.row1 = box->m_捐款按钮_B站->m_Size;
	mat.row2 = { 6, 0 };
	
	box->m_印章绘制.f_alloc(4);
	auto C1 = f_PackData4X8(box->m_捐款按钮_B站->m_颜色A);
	auto 阴影颜色 = f_PackData4X8({ 100, 0, 0, 200 });
	box->m_印章绘制.f_set单色线(0, mat, { 1.0, 阴影颜色, 阴影颜色 }, S_Widget预设凸包图元::m_圆角矩形, 5);
	box->m_印章绘制.f_set单色线(2, mat, { 1.0, C1, C1 }, S_Widget预设凸包图元::m_圆角矩形, 3);

	box->m_文本绘制.f_绘制文本({ mat.row0 + vec2{2,2}, {20, 60} }, box->m_捐款按钮_B站->m_颜色A, 总块数量, L"B站充电", E_对齐方式::e_纵向齐);


	mat.row0 = box->m_捐款按钮_爱发电->m_Pos;
	mat.row1 = box->m_捐款按钮_爱发电->m_Size;
	auto C2 = f_PackData4X8(box->m_捐款按钮_爱发电->m_颜色A);
	box->m_印章绘制.f_set单色线(1, mat, { 1.0, 阴影颜色, 阴影颜色 }, S_Widget预设凸包图元::m_圆角矩形, 5);
	box->m_印章绘制.f_set单色线(3, mat, { 1.0, C2, C2 }, S_Widget预设凸包图元::m_圆角矩形, 2);

	box->m_文本绘制.f_绘制文本({ mat.row0 + vec2{2,2}, {20, 50} }, box->m_捐款按钮_爱发电->m_颜色A, 总块数量 + 1, L"爱发电", E_对齐方式::e_纵向齐);

}

static E_事件是否传递 on_捐款按钮_B站(C_Widget* self, const E_鼠标按钮& 按钮) {
	system("start https://space.bilibili.com/346141904");
	return E_事件是否传递::e_事件传递_终止;
}
static E_事件是否传递 on_捐款按钮_爱发电(C_Widget* self, const E_鼠标按钮& 按钮) {
	system("start https://afdian.net/a/MBT_Studio");
	return E_事件是否传递::e_事件传递_终止;
}

static E_事件是否传递 on_资助按钮部件鼠标移入(C_Widget* self, const S_鼠标& 鼠标) {
	self->m_颜色A = g明印章颜色;
	self->m_父部件->m_更新绘制属性 = true;
	return E_事件是否传递::e_事件传递_继续;
}
static E_事件是否传递 on_资助按钮部件鼠标移出(C_Widget* self, const S_鼠标& 鼠标) {
	self->m_颜色A = g暗印章颜色;
	self->m_父部件->m_更新绘制属性 = true;
	return E_事件是否传递::e_事件传递_继续;
}

static E_事件是否传递 on_教程按钮部件鼠标移入(C_Widget* self, const S_鼠标& 鼠标) {
	self->m_颜色A = { 0, 0, 0, 255 };
	self->m_父部件->m_更新绘制属性 = true;
	return E_事件是否传递::e_事件传递_继续;
}
static E_事件是否传递 on_教程按钮部件鼠标移出(C_Widget* self, const S_鼠标& 鼠标) {
	self->m_颜色A = g文件名称文字颜色;
	self->m_父部件->m_更新绘制属性 = true;
	return E_事件是否传递::e_事件传递_继续;
}


C_照壁文件页面::C_照壁文件页面(S_UI渲染环境& ctx) : C_Widget(&ctx) {

	mf_绘制 = on_照壁文件页面绘制;
	mf_布局 = on_照壁文件页面布局;
	mf_变换 = on_照壁文件页面变换;

	

	m_捐款按钮_B站 = f_ui_创建组件(&ctx);
	m_捐款按钮_爱发电 = f_ui_创建组件(&ctx);
	m_教程视频_B站 = f_ui_创建组件(&ctx);
	m_教程视频_Youtube = f_ui_创建组件(&ctx);


	m_捐款按钮_B站->m_WName = u"B站充电";
	m_捐款按钮_B站->mf_鼠标点击 = on_捐款按钮_B站;
	m_捐款按钮_B站->mf_鼠标进入 = on_资助按钮部件鼠标移入;
	m_捐款按钮_B站->mf_鼠标离开 = on_资助按钮部件鼠标移出;
	m_捐款按钮_B站->m_颜色A = { 100, 1, 1, 255 };

	m_捐款按钮_爱发电->m_WName = u"爱发电";
	m_捐款按钮_爱发电->mf_鼠标点击 = on_捐款按钮_爱发电;
	m_捐款按钮_爱发电->mf_鼠标进入 = on_资助按钮部件鼠标移入;
	m_捐款按钮_爱发电->mf_鼠标离开 = on_资助按钮部件鼠标移出;
	m_捐款按钮_爱发电->m_颜色A = { 100, 1, 1, 255 };


	m_教程视频_B站->mf_鼠标进入 = on_教程按钮部件鼠标移入;
	m_教程视频_B站->mf_鼠标离开 = on_教程按钮部件鼠标移出;
	m_教程视频_Youtube->mf_鼠标进入 = on_教程按钮部件鼠标移入;
	m_教程视频_Youtube->mf_鼠标离开 = on_教程按钮部件鼠标移出;

	m_教程视频_B站->m_颜色A = g文件名称文字颜色;
	m_教程视频_Youtube->m_颜色A = g文件名称文字颜色;


	f_添加子组件(m_捐款按钮_B站);
	f_添加子组件(m_捐款按钮_爱发电);
	f_添加子组件(m_教程视频_B站);
	f_添加子组件(m_教程视频_Youtube);

	f_构建最近文件组件();


	m_画心纹理 = f_纹理集_创建();

	//auto 画心纹理 = f_tex_创建图像纹理(m_UIctx->m_Ctx, {}, E_纹理格式::e_tf_RGB8U_U, E_纹理维度类型::e_2D);
	auto 文件路径 = (S_引擎配置::g_程序路径 / "照壁/画心/");
	S_目录文件包 目录文件;
	std::vector<std::string> 扩展名过滤 = {".jpg", ".png", ".hdr", ".tga" };
	f_file_get目录下所有文件名(文件路径.string(), 目录文件, 扩展名过滤);
	for (auto& e : 目录文件.文件) {
		//S_纹理* 画心纹理 = f_fromFile创建纹理(m_UIctx->m_Ctx, m_UIctx->m_Mat->m_采样器, 文件路径.string() + f_str_u16_to_u8(e));

		//f_纹理集_add纹理(m_画心纹理, 画心纹理);
	}
	f_纹理集_刷新所有纹理信息(m_画心纹理);

}

C_照壁文件页面::~C_照壁文件页面() {
	f_纹理集_销毁(m_画心纹理);
}

void C_照壁文件页面::f_构建最近文件组件() {
	f_widget_remove区间子组件(this, 4, -1, false);

	uint32 i = 0;
	for (auto& e : S_框架::g_最近打开文件) {
		auto* 最近打开文件按钮 = f_ui_创建组件(m_UIctx);

		最近打开文件按钮->m_WName = e;
		最近打开文件按钮->m_颜色A = g文件名称文字颜色;

		最近打开文件按钮->mf_鼠标进入 = on_教程按钮部件鼠标移入;
		最近打开文件按钮->mf_鼠标离开 = on_教程按钮部件鼠标移出;

		f_添加子组件(最近打开文件按钮);

		++i;
		if(i>=8) break;
	}

}










void on_打开示例文件(S_Props& prop) {
	C_照壁示例页面* box = dynamic_cast<C_照壁示例页面*>(prop.m_UI->m_部件->m_父部件);

	auto 文件路径 = S_引擎配置::g_程序路径.generic_u16string() + u"照壁/示例/" + f_ui_项滚动视口_取选择项名称(box->m_文件页面);
	f_projectFile_载入(文件路径);

	f_widget_top_close(f_ui_当前窗口管理());
}

static void on_照壁示例页面布局(C_Widget* self, C_Widget** w, uint32 num) {
	if (!num) return;

	C_照壁示例页面* box = dynamic_cast<C_照壁示例页面*>(self);

	vec2 size = self->m_Size - vec2{0, 30};
	w[0]->f_setSize(size);

	w[1]->f_setPos({ size.x - 65, size.y + 5 });
	w[1]->f_setSize({ 60, 20 });

}

C_照壁示例页面::C_照壁示例页面(S_UI渲染环境& ctx) : C_Widget(&ctx) {
	mf_布局 = on_照壁示例页面布局;


	m_文件页面 = f_ui_项滚动视口(ctx, S_节点UI主题::ui_节点图标);
	m_文件页面->m_WName = u"示例";
	f_添加子组件(m_文件页面);

	m_按钮 = f_alloc_OpsProp(on_打开示例文件, u"打开");
	C_Widget* 打开按钮 = f_ui_创建按钮(&ctx);
	打开按钮->m_图元形状 = &m_UIctx->m_Ctx.m_几何图形->m_平面下圆角矩形;
	f_添加子组件(打开按钮);


	S_目录文件包 目录文件;
	auto 文件路径 = S_引擎配置::g_程序路径 / "照壁/示例/";
	std::vector<std::string> 扩展名过滤 = { ".np" };
	f_file_get目录下所有文件名(文件路径.string(), 目录文件, 扩展名过滤);

	uint32 i = 0;
	for (auto& e : 目录文件.文件) {
		//文件路径 + f_WStringToString(e)
		f_ui_项滚动视口_添加节点项(m_文件页面, e, u"ico_缓存文件0019", i);
		++i;
	}
	//for (uint32 i = 0; i < 32; ++i) {
	//	f_ui_项滚动视口_添加节点项(m_文件页面, u"mbt", "ico_缓存文件0019", i);
	//}

}

C_照壁示例页面::~C_照壁示例页面() {

}

void f_随机切换画心纹理(C_照壁文件页面* box) {
	g画心ID = f_random_I32({ 0, DEF_Max(0, int32(box->m_画心纹理->data->count) - 1) }, time(nullptr));
}
